'use strict';

var YXCache = {
    /**
     用于判断是否需要输出日志  默认跟随系统 （即根据api.debug）
    */
    isDebug: function(params){
        if(!api.debug){
          // 非debug模式
          return false;
        }
        if(!arguments[0]){
            return api.debug;
        }else{
            return params;
        }
    },

    /**
      打印日志
    */
    print: function(params){
      if(YXCache.isDebug()){
        console.log(params)
      }
    },

    // +----------------------------------------------------------------------
    // | 网络环境 - 主要用于判断当前网络连接类型、以及实时监听当前网络环境变化
    // +----------------------------------------------------------------------
    /**
      获取当前的网络环境类型:
      unknown            //未知
      ethernet        //以太网
      wifi            //wifi
      2g                //2G网络
      3g                //3G网络
      4g                //4G网络
      none            //无网络
    */
    getConnectionType: function() {
        return api.connectionType.toLowerCase();
    },

    /**
     实时监听网络环境
    */
    addNetStatusListener: function(callBack) {
        api.addEventListener({
            name: 'online'
        }, function(ret, err) {
            callBack(ret.connectionType.toLowerCase())
        });

        api.addEventListener({
            name: 'offline'
        }, function(ret, err) {
            callBack('offline')
        });
    },
    /**
       判断Android机型 文件是否有存储权限
    */
    storagePermission:function(){
      if (api.systemType == 'android') {
          var resultList = api.hasPermission({
              list: ['storage']
          });
          if (!resultList[0].granted) {
            // 如果存储权限没有，则不处理文件写入
            return false;
          }else{
            return true;
          }
      }else{
        return true;
      }
    },

    // +----------------------------------------------------------------------
    // | 文件读写 - 缓存文件 - 主要用于存储ajax获取的json数据 - 便于无网查看
    // +----------------------------------------------------------------------
    /**
    * 读文件
    */
    readFile: function(fileName, callBack) {
        api.readFile({
            path: "fs://" + api.cacheDir + '/cachejson/' + fileName + '.json',
        }, function(ret, err) {
            callBack(ret, err);
        });
    },
    //写文件
    writeFile: function(json, fileName, callBack) {
      if(YXCache.storagePermission()){
        api.writeFile({
            //保存路径
            path: "fs://" + api.cacheDir + '/cachejson/' + fileName + '.json',
            //保存数据，记得转换格式
            data: JSON.stringify(json)
        }, function(ret, err) {
            if (ret.status) {
                YXCache.print("文件写入【成功】 - 文件名称：" + fileName + '.json')
            } else {
                YXCache.print('文件写入【错误】 - 错误信息：' + err.smg + "；错误代码：" + err.code + "；文件名称：" + fileName + '.json')
            }
        })
      }
    },
    //判断文件是否存在 - 异步
    isHasFile: function(filePath, success, error) {
        var fs = api.require('fs');
        fs.exist({
            path: filePath
        }, function(ret, err) {
            if (ret.exist) {
                if (typeof success == 'function')
                    success(ret, err);
            } else {
                if (typeof error == 'function')
                    error(ret, err);
            }
        });
    },

    //判断文件是否存在 - 同步
    isHasFileSync: function(filePath) {
        var fs = api.require('fs');
        var ret = fs.existSync({
            path: filePath
        });
        if (ret.exist) {
            return true;
        } else {
            return false;
            YXCache.print(JSON.stringify(err));
        }
    },

    //获取api地址 最后一个 单词 为了给对应接口存储的json文件命名
    getName: function(url) {
        var _name = url.split('/');
        _name = _name[_name.length - 1];
        return _name;
    },

    // +----------------------------------------------------------------------
    // | 下载多媒体文件 - 缓存图片
    // | 页面调用缓存图片方法：getCachePic(url)
    // +----------------------------------------------------------------------
    //获取本地缓存图片
    getCachePic: function(url) {
        //判断图片文件名是否获取成功
        if (YXCache.getFileName(url)) {

            var imgFile = api.cacheDir + "/cachepic/" + YXCache.getPicName(url);
            if (YXCache.isHasFileSync("fs://" + imgFile)) {
                if (api.systemType === 'ios') {
                    return api.fsDir + imgFile;
                } else {
                    return api.fsDir + imgFile;
                }
            } else {
                return url;
            }
        } else {
            return url;
        }
    },

    /**
    下载图片
    @params url  下载的图片地址  全路径
    @params currentFn 当前下载的进度
    @params successFn 下载成功回调
    @params errorFn  下载失败回调
    */
    downPic: function(url, currentFn, successFn, errorFn) {

        //判断是否是图片资源
        if (YXCache.isImg(url) && YXCache.storagePermission()) {
            //判断图片文件名是否获取成功 并且本地不存在本文件
            if (YXCache.getPicName(url)) {
                YXCache.print('======文件路径++++++++++++' + url);

                var fs = api.require('fs');
                // 判断文件是否已存在，已存在是不下载
                fs.exist({
                    path: "fs://" + api.cacheDir + "/cachepic/" + YXCache.getFileName(url)
                }, function(ret, err) {
                    if (ret.exist) {
                        YXCache.print('文件已存在，不再下载')
                    } else {
                        YXCache.print('文件不存在，继续下载缓存到本地')
                        api.download({
                            url: url,
                            savePath: "fs://" + api.cacheDir + "/cachepic/" + YXCache.getFileName(url),
                            report: true,
                            cache: true,
                            allowResume: true
                        }, function(ret, err) {
                            //下载中
                            if (typeof currentFn === 'function')
                                currentFn(ret);
                            YXCache.print('【下载中】- 图片名称：' + url + '；图片大小：' + ret.fileSize + '；下载进度：' + ret.percent + '；下载状态' + ret.state);
                            //下载成功
                            if (ret.state == 1) {
                                if (typeof successFn === 'function')
                                    successFn(ret);
                                YXCache.print('【下载成功】- 图片名称：' + url + '；图片大小：' + ret.fileSize + '；下载进度：' + ret.percent + '；下载状态' + ret.state + '；存储路径: ' + ret.savePath);
                                //下载失败
                            } else {
                                if (typeof errorFn === 'function')
                                    errorFn(err);
                            }
                        });
                    }
                });
            } else {
                YXCache.print("【图片文件名获取失败】：" + url);
            }
        }
    },
    //判断是否图片资源
    isImg: function(src) {
        if (!/.(gif|jpg|jpeg|png|tiff|bmp|pcx)$/.test(src)) {
            return false;
        } else {
            return true;
        }
    },
    //获取图片名称
    getPicName: function(url) {
        if (url.indexOf("?") > 0) {
            var _name = url.split('?');
            _name = _name[0];
            _name = _name.split('/');
            _name = _name[_name.length - 1];
            return _name;
        } else {
            if (url.indexOf("/") > 0) {
                return url.substring(url.lastIndexOf("/") + 1, url.length);
            } else {
                return false;
            }
        }
    },
    //遍历解析Json - 进行数据操作 - 主要为了提取 多媒体链接信息 - 下载多媒体
    parseJsonDwonPic: function(jsonObj,host) {

        var Host = !arguments[1]?'':host;
        // 循环所有键
        for (var key in jsonObj) {
            //如果对象类型为object类型且数组长度大于0 或者 是对象 ，继续递归解析
            var element = jsonObj[key];
            if (element.length > 0 && typeof(element) == "object" || typeof(element) == "object") {
                YXCache.parseJsonDwonPic(element,host);
            } else { //不是对象或数组、直接输出
                YXCache.print(key + ":" + element);
                YXCache.downPic(Host + element);
            }
        }
    },

    // +----------------------------------------------------------------------
    // | 下载多媒体文件 - 缓存文件
    // | 页面调用缓存图片方法：getCacheFile(url)
    // +----------------------------------------------------------------------
    //获取本地缓存文件
    getCacheFile: function(url) {
        if (api.systemType == 'android') {
            var resultList = api.hasPermission({
                list: ['storage']
            });
            if (!resultList[0].granted) {
                return url;
            }
        }
        //判断图片文件名是否获取成功
        if (YXCache.getFileName(url)) {
            var fileFile = api.cacheDir + "/cachefile/" + YXCache.getFileName(url);
            if (YXCache.isHasFileSync("fs://" + fileFile)) {
                if (api.systemType === 'ios') {
                    return api.fsDir + fileFile;
                } else {
                    return api.fsDir + fileFile;
                }
            } else {
                return url;
            }
        } else {
            return url;
        }
    },

    //下载文件
    downFile: function(url, currentFn, successFn, errorFn) {
        //判断是否是文件资源
        if (YXCache.isFile(url) && YXCache.storagePermission()) {
            //判断图片文件名是否获取成功 并且本地不存在本文件
            if (YXCache.getFileName(url)) {
                var fs = api.require('fs');
                fs.exist({
                    path: "fs://" + api.cacheDir + "/cachefile/" + YXCache.getFileName(url)
                }, function(ret, err) {
                    if (ret.exist) {
                        YXCache.print('文件已存在，不再下载')
                    } else {
                        YXCache.print('文件不存在，下载缓存到本地')
                        api.download({
                            url: url,
                            savePath: "fs://" + api.cacheDir + "/cachefile/" + YXCache.getFileName(url),
                            report: true,
                            cache: true,
                            allowResume: true
                        }, function(ret, err) {
                            //下载中
                            if (typeof currentFn === 'function')
                                currentFn(ret);
                            YXCache.print('【下载中】- 文件名称：' + url + '；文件大小：' + ret.fileSize + '；下载进度：' + ret.percent + '；下载状态' + ret.state);
                            //下载成功
                            if (ret.state == 1) {
                                if (typeof successFn === 'function')
                                    successFn(ret);
                                YXCache.print('【下载成功】- 文件名称：' + url + '；文件大小：' + ret.fileSize + '；下载进度：' + ret.percent + '；下载状态' + ret.state + '；存储路径: ' + ret.savePath);
                                //下载失败
                            } else {
                                if (typeof errorFn === 'function')
                                    errorFn(err);
                            }
                        });
                    }
                });
            } else {
                YXCache.print("【文件名获取失败】：" + url);
            }
        }
    },
    //判断是否图片资源
    isFile: function(src) {
        if (!/.(mp3|wma|flac|aac|mmf|amr|m4a|m4r|ogg|mp2|wav|wv|mp4)$/.test(src)) {
            return false;
        } else {
            return true;
        }
    },
    //获取图片名称
    getFileName: function(url) {
        if (url.indexOf("?") > 0) {
            var _name = url.split('?');
            _name = _name[0];
            _name = _name.split('/');
            _name = _name[_name.length - 1];
            return _name;
        } else {
            if (url.indexOf("/") > 0) {
                return url.substring(url.lastIndexOf("/") + 1, url.length);
            } else {
                return false;
            }
        }
    },
    //遍历解析Json - 进行数据操作 - 主要为了提取 多媒体链接信息 - 下载多媒体
    parseJsonDwonFile: function(jsonObj,host) {
        var Host = !arguments[1]?'':host;
        // 循环所有键
        for (var key in jsonObj) {
            //如果对象类型为object类型且数组长度大于0 或者 是对象 ，继续递归解析
            var element = jsonObj[key];
            if (element.length > 0 && typeof(element) == "object" || typeof(element) == "object") {
                YXCache.parseJsonDwonFile(element,host);
            } else { //不是对象或数组、直接输出
                YXCache.downPic(Host + element);
                YXCache.downFile(Host + element);
            }
        }
    },
}
